// 存入本地, 实现持久化, 页面刷新不必发起请求就可以获得token
import { removeToken, setToken, getToken, setTimeStamp } from '@/utils/auth'
import { login, getUserInfo, getUserDetailById } from '@/api/user'
import { resetRouter } from '@/router'

const state = {
  token: getToken(),
  userInfo: {}
}
const mutations = {
  // 更新token
  setToken (state, token) {
    state.token = token
    setToken(token)
  },
  // 删除token
  removeToken (state, token) {
    state.token = null
    removeToken()
  },
  // 设置用户信息
  setUserInfo (state, result) {
    state.userInfo = result
  },
  // 删除用户信息
  removeUserInfo (state) {
    state.userInfo = {}
  }
}
const actions = {
  async login (context, data) {
    const result = await login(data)
    context.commit('setToken', result)
    // 写入时间戳
    setTimeStamp() // 将当前的最新时间写入缓存
  },
  // 获取用户资料action
  async getUserInfo (context) {
    const result = await getUserInfo()
    const baseInfo = await getUserDetailById(result.userId)
    const baseResult = { ...result, ...baseInfo } // 将两个接口结果合并
    context.commit('setUserInfo', baseResult)
    // 加一个点睛之笔  这里这一步，暂时用不到，但是请注意，这给我们后边会留下伏笔
    // return baseResult
  },
  // 登出的action
  logout (context) {
    // 删除token
    context.commit('removeToken')
    // 删除用户信息
    context.commit('removeUserInfo')
    // 重置多页签
    context.dispatch('tagsView/delAllViews', null, { root: true })
    // 重置路由 调用
    resetRouter()
    // 重置vuex中存储的路由列表为级静态路由
    // 子模块调用子模块的action  默认情况下user的context是user,无法commit另一个子模块的action
    // 可设置第三个参数为{root: true} 解决此问题
    context.commit('permission/setRoutes', [], { root: true })
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}
